package br.usp.ime.ingpos.testes.services;

import java.util.Collections;
import java.util.List;

import javax.persistence.OrderBy;
import javax.persistence.criteria.Order;

import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.beans.BeanUtils;

import br.usp.ime.ingpos.modelo.AreaDePesquisa;
import br.usp.ime.ingpos.modelo.DadosPessoais;
import br.usp.ime.ingpos.modelo.Orientador;
import br.usp.ime.ingpos.modelo.Usuario;
import br.usp.ime.ingpos.modelo.dao.AreaDePesquisaDAO;
import br.usp.ime.ingpos.modelo.dao.OrientadorDAO;
import br.usp.ime.ingpos.modelo.dao.PerfilDao;
import br.usp.ime.ingpos.services.OrientadorService;
import br.usp.ime.ingpos.testes.BancoDeDadosTestCase;

public class OrientadorServicesTeste
    extends
        BancoDeDadosTestCase
{

    public OrientadorServicesTeste(
        String name )
    {
        super( name );
        // TODO Auto-generated constructor stub
    }

    @Test
    public void testAdicionarQuantosOrientadosDeseja()
    {
        OrientadorDAO orientadorDAO = new OrientadorDAO( getSessionCreator() );
        PerfilDao perfilDao = new PerfilDao( getSessionCreator() );
        AreaDePesquisaDAO areaDePesquisaDao = new AreaDePesquisaDAO( getSessionCreator() );
        Orientador orientador = new Orientador();
        Orientador orientadorCopia = new Orientador();
        Orientador orientadorCopia2 = new Orientador();
        DadosPessoais dadosPessoais = new DadosPessoais();
        List<Orientador> orientadores = null;
        int quantidadeDeOrientadoresAntes , quantidadeDeOrientadoresDepois;
        
        List<AreaDePesquisa> areasDePesquisa= null;
        areasDePesquisa = areaDePesquisaDao.findAll();

        orientadores = orientadorDAO.findAll();
        orientador = orientadorDAO.findAll().get( orientadores.size() -1 );
        
        
        OrientadorService orientadorService = new OrientadorService( orientadorDAO, areaDePesquisaDao, perfilDao );
        

        orientadorService.salvarQuantidadeDeOrientandosDesejados( orientador.getUsuarioID(), 2 );
        assertEquals( 2, orientador.getQuantidadeOrientandosDesejados() );
          
        orientadorCopia.setEmail( "emailTeste" );
        orientadorCopia.setSenha( "123456" );
        dadosPessoais.setNomeCompleto( "nomeTeste" );
        orientadorCopia.setDadosPessoais( dadosPessoais );
        
        orientadorService.salvar( orientadorCopia );
        orientadorCopia2 = orientadorService.procurarPorHash( orientadorCopia.getHash() );
        assertEquals( orientadorCopia.getUsuarioID(), orientadorCopia2.getUsuarioID() );
        
        orientadores = orientadorDAO.findAll();
        quantidadeDeOrientadoresAntes = orientadores.size();
        orientadorService.deletarOrientador( orientadorCopia );
        orientadores = orientadorDAO.findAll();
        quantidadeDeOrientadoresDepois = orientadores.size();
        
        assertNotSame( quantidadeDeOrientadoresAntes, quantidadeDeOrientadoresDepois );
        
        orientadorService.salvar( orientador );       
        
    }
    
    @Test 
    public void testBuscaPorOrientadores()
    {
        OrientadorDAO orientadorDAO = new OrientadorDAO( getSessionCreator() );
        PerfilDao perfilDao = new PerfilDao( getSessionCreator() );
        AreaDePesquisaDAO areaDePesquisaDao = new AreaDePesquisaDAO( getSessionCreator() );
        Orientador orientador = new Orientador();
        OrientadorService orientadorService = new OrientadorService( orientadorDAO, areaDePesquisaDao, perfilDao );
        
        orientador = orientadorDAO.findAll().get( 0 );
        
        assertNotNull(orientadorService.procuraOrientadorPorNome( orientador.getDadosPessoais().getNomeCompleto() ));
        assertNotNull(orientadorService.procurarPorId( orientador.getUsuarioID() ));        
        assertEquals( orientador, orientadorService.procurarPorHash( orientador.getHash() ) );

        
    }
}
